package comunicaciones
import traits.TDescuentoPlanAmigos
import traits.TDescuentoCiudadesAmigas
import traits.TDescuentoHablateTodo
import planes.PrepagoLocal
import planes.PrepagoInternacional
import java.util.Date

class LlamadaLargaDistancia(num :Int, segundos : Int, localidadOrig :String, localidadDes : String, paisDes :String) extends Llamada {
    var numDest = num
	var duracion = segundos
    var locOrig = localidadOrig
	var locDes = localidadDes
	var pais = paisDes
	val tabla = new TablaConLocalidades()
    
    /**
     * Gett & Sett
     */
    def getLocOrig() : String = {
	  this.locOrig
	}
	
	def setLocOrig(localidad : String) : Unit = {
	  this.locOrig = localidad
	}
	
	def getLocDes() : String = {
	  this.locDes
	}
	
	def setLocDes(localidad : String) : Unit = {
	  this.locDes = localidad
	}

	
	/**
	 * Aplica a una llamada de larga distancia el descuento del plan numeros amigos
	 */
	override def paraNumerosAmigos(nums :List[Int]) : Comunicacion =  {
	    var call = new LlamadaLargaDistancia(this.numDest,this.duracion,this.locOrig,this.localidadDes,this.pais) with TDescuentoPlanAmigos{
	      override def numerosEnPlan = nums
	    }
	    call.fecha = this.fecha
	    call
	}
	
	/**
	 * Aplica a una llamada de larga distancia el descuento del plan ciudades amigas
	 */
	override def paraCiudadesAmigas(ciudad :String) : Comunicacion = {
        var call = new LlamadaLargaDistancia(this.numDest,this.duracion,this.locOrig,this.localidadDes,this.pais) with TDescuentoCiudadesAmigas {
          override val ciudadEnPlan = ciudad
        }
	    call.fecha = this.fecha
	    call
    }
	
	/**
	 * Aplica a una llamada de larga distancia el descuento del plan hablat todo
	 */
	override def paraHablateTodo() : Comunicacion = {
	    var call = new LlamadaLargaDistancia(this.numDest,this.duracion,this.locOrig,this.localidadDes,this.pais) with  TDescuentoHablateTodo
	    call.fecha = this.fecha
	    call
	}
	
	/**
	 * Aplica a una llamada de larga distancia el descuento del planprepago internacional
	 */
	override def paraPrepagoInternacional(plan : PrepagoInternacional) : Comunicacion = {
	   this.verificarMes(plan)
	   this.aplicarDescuento(plan)
	   this
	}
	
	// Auxiliar de paraPrepagoInternacional(plan : PrepagoInternacional) : Comunicacion
	def verificarMes(plan :PrepagoInternacional) : Unit ={
	   if(this.getMes() != plan.mes){  // Si la llamada es de otro mes al del plan
          plan.minsRestantes = plan.mins      // Los 30 minutos se vuelvena  recargar
          plan.mes = this.getMes()      // El mes se actualiza
        }	
	}
	
	// Auxiliar de paraPrepagoInternacional(plan : PrepagoInternacional) : Comunicacion
	def aplicarDescuento(plan : PrepagoInternacional){
	  if(plan.minsRestantes > 0 && (this.paisDes == "Argentina")){          // Si tengo 0 minutos del Plan, no descuento y la llamada se cobra 
        									  //   toda, si tengo minutos, descuento
        	if(plan.minsRestantes >= this.getDuracion()){  
        		plan.minsRestantes = plan.minsRestantes - this.getDuracion()
        		this.setDuracion(0)
        	}else{
        		var segsUsados = this.getDuracion()
        		this.setDuracion(this.getDuracion() - plan.minsRestantes)
        		plan.minsRestantes = segsUsados - plan.minsRestantes
        	}
        }
	}
	
	/**
	 *  Calcula el precio de la llamada
	 */
	def calcularPrecio :Double ={
	    val precioDeLocalidades = this.tabla.tablaConPrecios.get(this.localidadOrig+" "+this.localidadDes)
		var total = 0.0
	    if(this.duracion > 60){
			  total += precioDeLocalidades.get
			  total += calcularPrecioEnSegs(precioDeLocalidades.get, this.duracion - 60)
			  total
		 }
		else{if(this.duracion.equals(0)){
			0.0
		     }else{ precioDeLocalidades.get }
			 
		} 
	}
	
	// Auxiliar de  precioParaSinPlan(): Double
		def calcularPrecioEnSegs(precio : Double, duracion : Int): Double ={
		  if(duracion < 10){
		    0.0
		  }
		  else{
		    precio + this.calcularPrecioEnSegs(precio, duracion - 10)
		  }
		}
}